//package javango.contrib.hibernate;
//
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.Map;
//import java.util.Set;
//
//import javango.forms.fields.MultipleLongChoiceField;
//import javango.forms.widgets.SelectMultipleWidget;
//import javango.forms.widgets.WidgetFactory;
//
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
//
//import com.google.inject.Inject;
//
//public class ModelMultipleChoiceField extends MultipleLongChoiceField {
//
//	private final static Log log = LogFactory.getLog(ModelMultipleChoiceField.class);
//	
//	private Class modelClass;
//	Map<String, Object> choices = new HashMap<String, Object>();
//	protected HibernateUtil hibernateUtil;
//	
//	@Inject
//	public ModelMultipleChoiceField(WidgetFactory widgetFactory, HibernateUtil hibernateUtil) {
//		super(widgetFactory);
//		this.hibernateUtil = hibernateUtil;
//	}
//
//	public ModelMultipleChoiceField(WidgetFactory widgetFactory, HibernateUtil hibernateUtil, Class modelClass) {
//		this(widgetFactory, hibernateUtil);
//		setModel(modelClass);
//	}
//	
//	public ModelMultipleChoiceField setModel(Class modelClass) {
//		this.modelClass = modelClass;
//			
//		try {
//			ModelDao dao = new ModelDao(hibernateUtil, modelClass);
//			
//			for (Object choice : dao.filter().list()) {
//				choices.put(dao.getPk(choice).toString(), choice.toString());
//			}
//	
//			this.setWidget(new SelectMultipleWidget(null, choices));
//		} catch (DaoException e) {
//			log.error(e,e);
//		}
//		return this;
//	}
//
//	public Map<String, Object> getChoices() {
//		return choices;
//	}
//
//	@Override
//	public ModelMultipleChoiceField setChoices(Map<String, Object> choices) {
//		if (modelClass == null) {
//			// TODO Iteratr the list looking for the first non-null entry,  nulls shoudl be treaded as a blank entry.
//			// set model class to the class of the first choice.
//			if (choiceList != null && choiceList.size() > 0) {
//				Object first = choiceList.get(0).getClass(); 
//				this.modelClass = first == null ? null : first.getClass();
//			} else { // no choices
//				return this;
//			}
//			if (modelClass == null) {
//				log.error("Unable to set choices without a modelClass");
//				return null;
//			}
//		}
//
//		this.choices = choices;
//		return this;
//	}
//
//	@Override
//	public Set<Object> clean(String value, Map<String, String> errors) {
//		Long pk = (Long)super.clean(value, errors);
//		if (!errors.isEmpty()) {
//			return null;
//		}
//		try {
//			Set<Object> clean = new HashSet<Object>();
//			if (pk == null) {
//				return clean;
//			}
//			clean.add(new ModelDao(hibernateUtil, modelClass).get(pk)); 
//			return clean;
//		} catch (DaoException e) {
//			log.error(e,e);
//			errors.put(this.getName(), e.toString());
//		}
//		return null;
//
//	}
//	
//	@Override
//	public Set<Object> clean(String value[], Map<String, String> errors) {
//		log.debug("Starting clean for " + getName());
//		Long[] pks = (Long[])super.clean(value, errors);
//		if (pks == null) {
//			if (this.isRequired()) {
//				errors.put(getName(), "Required");
//				return null;
//			} else {
//				return new HashSet<Object>();
//			}
//		}
//		log.debug("Got pk=" + pks);
//		if (!errors.isEmpty()) return null;
//
//		// TODO handle null ie no record matches errors
//		try {
//			Set<Object> clean = new HashSet<Object>();
//			int i=0;
//			for (Long pk : pks) {
//				clean.add(new ModelDao(hibernateUtil, modelClass).get(pk)); 
//			}
//			return clean;
//		} catch (DaoException e) {
//			log.error(e,e);
//			errors.put(this.getName(), e.toString());
//		}
//		return null;
//	}
//}
